home *** CD-ROM | disk | FTP | other *** search
/ Aminet 4 / Aminet 4 - November 1994.iso / aminet / comm / ums / ums109_1.lha / Tools / ReadMessage.LHA / ReadMessage / txt / ReadMessage.mod next >
Text File  |  1994-04-06  |  6KB  |  173 lines

  1. (* ------------------------------------------------------------------------
  2. :Program.    ReadMessage
  3. :Contents.   reads a message from UMS' messagebase
  4. :Author.     Kai Bolay [kai]
  5. :Address.    Snail Mail:              EMail:
  6. :Address.    Hoffmannstraße 168       UUCP: kai@amokle.stgt.sub.org
  7. :Address.    D-71229 Leonberg         FIDO: 2:2407/106.3
  8. :History.    v1.0 [kai] 25-Mar-93 added Martin's suggestion
  9. :History.    v1.1 [kai] 31-Mar-93 new tags
  10. :History.    v1.2 [kai] 15-Apr-93 added SERVER keyword, better Login() failure
  11. :History.    v1.3 [kai] 22-Sep-93 updated for V40 Intefaces
  12. :History.    v1.4 [hG] 06 Apr 1994 outputs flags and more fields
  13. :Copyright.  Public Domain
  14. :Language.   Oberon
  15. :Translator. AmigaOberon 3.11
  16. :Imports.    ums, UMSSupport[hG]
  17. :Bugs.       Does not display links (crosspostings, carbon copies)
  18. ------------------------------------------------------------------------ *)
  19.  
  20. MODULE ReadMessage;
  21.  
  22. IMPORT
  23.   ums,
  24.   US := UMSSupport,
  25.   I: Intuition, d: Dos, e: Exec, u: Utility,
  26.   NoGuru, Break,
  27.   y: SYSTEM;
  28.  
  29. CONST
  30.   Template = "USER/A,PASSWORD,SERVER/K,NUM/A/N,NoText=OnlyHeaders/S,NoUpdate/S"
  31.              "\o$VER: ReadMessage 1.4 (6.4.94)";
  32.  
  33. TYPE
  34.   FlagTexts = ARRAY MAX(LONGSET)+1 OF ARRAY 20 OF CHAR;
  35.  
  36. CONST
  37.  userFlagTexts = FlagTexts(
  38.    "0","1","2","3", "Archive", "Junk", "PostPoned",
  39.    "Selected", "Old", "WriteAccess", "ReadAccess",
  40.    "ViewAccess", "Owner", "13", "14", "Filtered",
  41.    "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26",
  42.    "27", "28", "29", "30", "31");
  43.  
  44.  globalFlagTexts = FlagTexts(
  45.    "Deleted", "Expired", "Exported", "Orphan", "Link", "HardLink",
  46.    "6", "7", "8", "9", "10", "11", "12", "13", "14", "15",
  47.    "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26",
  48.    "27", "28", "29", "30", "31");
  49.  
  50. VAR
  51.   rd: d.RDArgsPtr;
  52.   args: STRUCT (dummy: d.ArgsStruct)
  53.     name: e.STRPTR;
  54.     password: e.STRPTR;
  55.     server: e.STRPTR;
  56.     num: UNTRACED POINTER TO LONGINT;
  57.     noText: d.ArgBool;
  58.     noUpdate: d.ArgBool;
  59.   END;
  60.   account: LONGINT;
  61.   fields: ums.MsgTextFields;
  62.   chain: ARRAY 4 OF LONGINT;
  63.   globalFlags, userFlags: LONGSET;
  64.  
  65. PROCEDURE WriteAddress(name, addr: INTEGER; text: ARRAY OF CHAR); (* $CopyArrays- *)
  66. BEGIN
  67.   IF fields[name] # NIL THEN
  68.     IF fields[addr] = NIL THEN fields[addr] := y.VAL (ums.STRPTR, y.ADR ("")) END;
  69.     d.PrintF ("%s: %s <%s>\n", y.ADR(text), fields[name], fields[addr]);
  70.   END;
  71. END WriteAddress;
  72.  
  73. PROCEDURE WriteField(num: INTEGER; text: ARRAY OF CHAR); (* $CopyArrays- *)
  74. BEGIN
  75.   IF fields[num] # NIL THEN d.PrintF ("%s: %s\n", y.ADR(text), fields[num]); END;
  76. END WriteField;
  77.  
  78.  
  79. PROCEDURE WriteFlags(flags: LONGSET; texts: FlagTexts; title: ARRAY OF CHAR);
  80. (* $CopyArrays- *)
  81. VAR
  82.   i: INTEGER;
  83. BEGIN
  84.   IF flags # LONGSET{} THEN
  85.     i := 0;
  86.     d.PrintF("%s: ", y.ADR(title));
  87.     REPEAT
  88.       IF i IN flags THEN d.PrintF("%s ", y.ADR(texts[i])); END;
  89.       INC(i);
  90.     UNTIL i>MAX(LONGSET);
  91.     d.PrintF("\n");
  92.   END;
  93. END WriteFlags;
  94.  
  95.  
  96. BEGIN
  97.   rd := d.ReadArgs (Template, args, NIL);
  98.   IF rd = NIL THEN
  99.     d.PrintF ("Usage: %s\n", y.ADR (Template));
  100.     HALT (20);
  101.   END;
  102.   (* $OddChk- $NilChk- *)
  103.   account := ums.UMSRLogin (args.server^, args.name^, args.password^);
  104.   (* $OddChk= $NilChk= *)
  105.   IF account <= 0 THEN
  106.     d.PrintF ("Unable to login\n");
  107.     HALT (20);
  108.   END;
  109.  
  110.   (* read the message *)
  111.   IF ums.ReadUMSMsgTags (account,
  112.             ums.tagMsgNum,     args.num^,
  113.             ums.tagTextFields, y.ADR (fields),
  114.             ums.tagRReadAll,   I.LTRUE,
  115.             ums.tagRNoUpdate,  args.noUpdate,
  116.             ums.tagRChainUp,   y.ADR(chain[0]),
  117.             ums.tagRChainDn,   y.ADR(chain[1]),
  118.             ums.tagRChainLt,   y.ADR(chain[2]),
  119.             ums.tagRChainRt,   y.ADR(chain[3]),
  120.             ums.tagRGlobalFlags, y.ADR(globalFlags),
  121.             ums.tagRUserFlags,   y.ADR(userFlags),
  122.             u.done) THEN END;
  123.   US.CheckErr(account);
  124.  
  125.   WriteAddress(ums.fromName,  ums.fromAddr, "From");
  126.   WriteAddress(ums.replyName, ums.replyAddr, "Reply To");
  127.   WriteAddress(ums.toName,    ums.toAddr, "To");
  128.  
  129.   WriteField(ums.subject,     "Subject");
  130.   WriteField(ums.group,       "Group");
  131.   WriteField(ums.replyGroup,  "Reply Group");
  132.   WriteField(ums.folder,      "Folder");
  133.   WriteField(ums.msgID,       "Message ID");
  134.   WriteField(ums.fidoID,      "FidoID: %\sn");
  135.   WriteField(ums.mausID,      "MausID");
  136.   WriteField(ums.refID,       "Refer ID");
  137.   WriteField(ums.creationDate,"Creation Date");
  138.   WriteField(ums.receiveDate, "Receive Date");
  139.   WriteField(ums.attributes,  "Attributes");
  140.   WriteField(ums.organization,"Organization");
  141.   WriteField(ums.distribution,"Distribution");
  142.   WriteField(ums.newsreader,  "Newsreader");
  143.   (* WriteField(ums.comments,    "Comments"); *)
  144.   WriteField(ums.errorText,   "ErrorText");
  145.  
  146.   WriteFlags(globalFlags,globalFlagTexts,"Global Status");
  147.   WriteFlags(userFlags,userFlagTexts,"User Status");
  148.  
  149.   (*    Message-Tree   This is a tree of messages build by UMS regarding     *)
  150.   (*          a        the reference IDs of messages. (a) and (c) both       *)
  151.   (*         / \       refer to (a). (d), (e) and (f) refer to (b) and       *)
  152.   (*        b   c      (g) refers to (e). If you read message (e) you'll     *)
  153.   (*       /|\         get (b) for chain up ("-"), (g) for chain down ("+")  *)
  154.   (*      d e f        and (d) and (f) as chain left ("<") and right (">").  *)
  155.   (*        |          Please support this in a newsreader and don't forget  *)
  156.   (*        g          to create reference IDs in replies and follow-up      *)
  157.  
  158.   d.PrintF ("Chain: -%-5ld +%-5ld <%-5ld >%-5ld\n", chain[0], chain[1], chain[2], chain[3]);
  159.  
  160.   IF args.noText = d.DOSFALSE THEN
  161.     d.PrintF ("\n%s\n%s\n", fields[ums.msgText], fields[ums.comments]);
  162.   ELSE
  163.     d.PrintF ("Comments:\n%s\n", fields[ums.comments]);
  164.   END;
  165.  
  166.   ums.FreeUMSMsg (account, args.num^);
  167.  
  168. CLOSE
  169.   IF account # NIL THEN ums.Logout (account); END;
  170.   IF rd # NIL THEN d.FreeArgs (rd); END;
  171.  
  172. END ReadMessage.
  173.